Парсерные функции

Парсерные функции в ТОМ2 используются при анализе и выполнении команд на естественном языке. В отличие от других языков, парсерные функции не имеют имён и вызываются исключительно по аргументам.

Пример вызова функции:

Дай мяч Маше

Функции являются программируемыми комбинаторами. В отличии от встроенных системных комбинаторов, работа функций на каждом этапе парсинга тонко настраивается с помощью описания аргументов и кода функции.
Функции участвуют в построении синтаксического дерева наравне с другими комбинаторами. Для разбора одной фразы может быть использовано сочетание нескольких функций, или напротив, одна и та же функция может быть применена к разным участкам фразы. Подробнее см. принцип работы парсера.

Типы парсерных функции

Cуществует три типа функций:
действие (action);
- выражение (expression);
- факт (fact).

Такое деление обусловлено наличием в русском языке императивных, указательных и декларативных конструкций, требующих особого обращения при парсинге, и соответственно своего типа парсерной функции.

Ниже описываются принципы, общие для всех типов парсерных функций.
Для получения более детальной информации смотрите соответствующие разделы: Действие, Выражение, Факт.



Конструктор функции

Конструктор функции имеет следующий синтаксис:

< fn_type > ( < type > [arg_name][#key][, < type > [arg_name][#key][, ...]])
{
  [общий код]

  [--parsing | парсинг--]

  [код секции]

  [--check | проверка--]

  [код секции]

  [--execute | выполнение--]

  [код секции]
}

Где:
fn_type – тип функции;
(...) – список аргументов функции;
{...} – код тела функции, разделённый на секции.

Список аргументов содержит один или более аргументов, перечисленных через запятую. Описание агрумента состоит из типа, имени и ключа, из которых обязательным является только тип.
Тело функции представляет собой код, разделённый на именованные секции, каждая из которых выполняет свою роль. Имена секций строго определены и описаны ниже.

Рассмотрим подробнее:

Тип аргумента

Тип аргумента влияет на подбор значений на роль аргумента функции. В качестве типа может быть указано одно из следующего: Тип значения: bool, string, number, course, spcvalue, object, attribute, class, location, word, preposition, and-list, or-list. Класс значения. Пример: "предмет "существо"и т.п. Имя объекта. Для объектных значений, имеющих имена, в качестве типа можно указывать имя конкрет- ного объекта. Произвольный литерал - должен в точности совпасть со словом, введенным игроком. Пример: "трах-тибидох"

Имя аргумента

Если имя переменной не указано, значение в функцию не передаётся, но по-прежнему влияет на подбор функций.

Ключ аргумента

Пример: #ВпЕч Здесь значение должно находиться в винительном падеже единственного числа. В состав ключа могут входить шаблоны ’ !’ и ’*’. * - подходит любое свойство ключа; ! - в ключе не должно быть указанного свойства. Пример: #*п!е Здесь у значения должен быть любой падеж, и не должно быть отрицания. Если ключ не указан, проверка значения на соответствие ключу не проводится.

Общий код

Место от начала тела функции до начала первой секции идеально подходит для объявления переменных и вычисления значений, необходимых внутри других секций. Общий код не является обязательным.

Секция parsing | парсинг

Во всех типах функций эта секция вызывается на этапе построения синтаксического дерева команды из командной строки или строки кода. Секция вызывается после подбора и проверки аргументов на соответствие типу и ключу, указанным в описании функции. Секция может вызываться многократно для различных комбинаций аргументов.

Здесь нужно проверить синтаксическую правильность переданных аргументов, например то что прилагательное стоит перед существительным и согласуется с ним по роду, числу, падежу и одушевлённости.

Если набор переданных аргументов не соответствует синтаксису функции, то секция должна вернуть ошибку.

Секция check | проверка

Секция check используется в типах функций действие (action) и факт (fact), но используется по-разному. Смотрите соответствующий раздел документации.

Секция execute | выполнение

Секция execute используется во всех 3х типах функций, но везде по-разному. Смотрите соответствующий раздел документации.

Сообщения об ошибках в секциях функций

ТОМ в процессе парсинга оперирует вариантными значениями. Каждый вариант имеет свой вес. Если в результате разбора получилось несколько значений с различными весами, выбор делается в пользу самого весомого. Это же относится и к формированию ошибок. Вес ошибки зависит от секции, в которой она возникла. Ошибки в секции ==parsing== весят меньше чем ошибки в секции ==check==. То есть при выборе между ==parsing== ошибка, "фраза не согласована по падежам" и ==check== ошибка, "этот ключ не подходит к двери" будет показана последняя ошибка.

Смотрите также

Действие, Выражение, Факт, Принцип работы парсера


to do:
Проверить корректность.
Добавить примеры.
Дополнить.